package com.fingard.csp.common.xml;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;

import java.util.HashMap;
import java.util.List;

public class XMLUtils {
    public Document document = null;
    public String fileNodeName = "";
    public HashMap<String, String> nodeMap = new HashMap<String, String>();
    public HashMap<String, String> attributeMap = new HashMap<String, String>();

    /**
     * doc初始化
     *
     * @param documents
     */
    public XMLUtils(Document documents) {
        document = documents;
    }

    /**
     * @param nodeName 节点名字
     * @return nodeValue 节点值
     * @Description: 获取xml中指定节点名字的值
     */
    public String getNodeValue(String nodeName) {
        String value = "";
        nodeMap.clear();        //先清空，如果想加快效率，就一个请求结果存一次map,然后再从map里取，用完就清空
        attributeMap.clear();    //先清空
        Element root = document.getRootElement();
        getNodes(root);
        value = nodeMap.get(nodeName);
        return value;
    }

    /**
     * @param nodeName 节点名字
     * @return nodeValue 节点值
     * @Description: 判断xml是否包含指定节点名
     */
    public boolean containName(String nodeName) {
        String value = "";
        nodeMap.clear();        //先清空，如果想加快效率，就一个请求结果存一次map,然后再从map里取，用完就清空
        attributeMap.clear();    //先清空
        Element root = document.getRootElement();
        getNodes(root);
        return nodeMap.containsKey(nodeName);
    }

    /**
     * @param nodeName      节点名字
     * @param attributeName 属性名字
     * @return attributeValue 属性值
     * @Description: 获取xml中指定节点名字指定属性名字的值
     */
    public String getAttributeValue(String nodeName, String attributeName) {
        String attributeValue = "";
        fileNodeName = nodeName;
        Element root = document.getRootElement();
        getNodes(root);
        attributeValue = attributeMap.get(attributeName);
        return attributeValue;
    }

    /**
     * 获取当前Doc所有子节点存入map
     *
     * @param node
     */
    public void getNodes(Element node) {
        nodeMap.put(node.getName(), node.getTextTrim());
        if (node.getName().equals(fileNodeName)) {
            // 当前节点所有属性的list
            List<Attribute> list = node.attributes();
            // 遍历当前节点的所有属性
            for (Attribute attribute : list) {
                attributeMap.put(attribute.getName(), attribute.getValue());
            }
        }

        // 递归遍历当前节点所有的子节点
        List<Element> listElement = node.elements();// 所有一级子节点的list
        for (Element e : listElement) {// 遍历所有一级子节点
            this.getNodes(e);// 递归
        }
    }
}